package cn.hchaojie.javase.day08;

import static org.junit.Assert.assertArrayEquals;

import java.util.Arrays;
import java.util.Comparator;

import org.junit.Test;

public class TestSort {
	@Test
	public void test1() {
		int[] array = {4, 5, 3, 8, 50, 20};
		
		Arrays.sort(array);
		
		System.out.println(Arrays.toString(array));
	}
	
	// Arrays.sort() 默认的规则是按字符串的字母序排序
	@Test
	public void test2() {
		String[] array = {"ab", "abc", "bc", "de", "bb"};
		
		Arrays.sort(array);
		
		System.out.println(Arrays.toString(array));
	}
	
	// 按照字符串长度进行排序（自定义的规则）
	@Test
	public void test3() {
		String[] array = {"ab", "abc", "bc", "de", "bb"};
		
		String[] expect = {"ab", "bc", "de", "bb", "abc"};
		
		// 排序
		// Arrays.sort(array /*待排序的数组*/, /*比较器*/);
		
		Arrays.sort(array, new StringComparator());
		
		System.out.println(Arrays.toString(array));
		
		assertArrayEquals(array, expect);
	}
	
	// 按照字符串长度进行排序（自定义的规则）
	// 字符串长的放到前面（跟测试3顺序相反）
	@Test
	public void test4() {
		String[] array = { "ab", "abc", "bc", "de", "bb" };

		String[] expect = {"abc", "ab", "bc", "de", "bb"};

		// 排序
		// Arrays.sort(array /*待排序的数组*/, /*比较器*/);

		Arrays.sort(array, new StringReverseComparator());

		System.out.println(Arrays.toString(array));

		assertArrayEquals(array, expect);
	}
}

// <T> 泛型，在这里是指的要比较的元素的类型
class StringComparator implements Comparator<String> {

	// 实现比较的逻辑
	// 如果o1比o2大，返回一个正数
	// 相等，反正0
	// o1比o2小，返回负数
	@Override
	public int compare(String o1, String o2) {
		int len1 = o1.length();
		int len2 = o2.length();
		
		if (len1 > len2) {
			return 1;
		} else if (len1 == len2) {
			return 0;
		} else {
			return -1;
		}
	}
}

class StringReverseComparator implements Comparator<String> {

	// 实现比较的逻辑
	// 如果o1比o2大，返回一个负数
	// 相等，反正0
	// o1比o2小，返回正数
	@Override
	public int compare(String o1, String o2) {
		int len1 = o1.length();
		int len2 = o2.length();
		
		if (len1 > len2) {
			return -1;
		} else if (len1 == len2) {
			return 0;
		} else {
			return 1;
		}
	}
}
